package April.Twenty_six;

import java.sql.*;
import java.util.Scanner;
/*
防止注入攻击
Statement接口实现类，作用执行sql语句，返回结果集
有一个子接口PreparefStatement的实现类的数据库的驱动中，如何获取接口的实现类

是Connection数据库连接对象的方法
PreparedStatement prepareStatement(String sql)
 */
public class JdbcDemo_2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //        注册驱动
        Class.forName("com.mysql.jdbc.Driver");
//        2. 获取连接对象
        String url = "jdbc:mysql://127.0.0.1:3306/myBase?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
        String userName = "root";
        String password = "123";
        Connection conn = DriverManager.getConnection(url, userName, password);
        Statement stat = conn.createStatement();

//        执行sql语句，数据表，查询用户名和密码，如果存在，登陆成功，不存在登陆失败
//        下面这种方法将密码和账户都写死了 而一般我们登陆都是用户直接输入的
//        String sql = "SELECT * FROM users WHERE username='a' AND PASSWORD='1' OR 1=1";

        Scanner sc = new Scanner(System.in );
        String user = sc.nextLine();
//        输入密码时输入 XXX‘or’1=1  则无论账户密码是否正确 都会进入
        String pass = sc.nextLine();
        String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
        //        调用Connection接口的方法prepareStatement，获取PreppareStatement接口的实现类
//        方法中的参数，sqql语句中的参数全部采用问号占位符
        PreparedStatement pst = conn.prepareStatement(sql);
//        调用pst对象set方法，设置问号占位符上的参数
        pst.setObject(1,user);
        pst.setObject(2,pass);

        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString("username")+" " +
                    " "+rs.getString("password"));

            rs.close();
            pst.close();
            conn.close();
        }
    }
}
